有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用SwingWorker避免冻结GUI

我正在做一个程序,在一个特定的文件夹中创建一些Excel文件(.xlsx),我的GUI有一个问题,因为当我调用创建这个文件的方法时,它是冻结的

我希望在GUI中有一个不确定的进度条,除了有一个异常和一个JLabel来显示excel文件正在创建之外,它不会停止

MailPanel类:当我点击一个名为“Generate”的按钮调用generateExcel()类的方法“generateExcel”时,它就是一个接口

public class MainPanel extends JPanel {
        .....
        .....
        btnGenerate.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                jsonFileIssues = ..... ;
                jsonFileProject = ..... ;
                Project project = ..... ;
                key = project.getKey();
                category = project.getCategory();

                String ruta = "C:\\JIRA\\JIRA-Proyectos\\" + category + "\\";   

                .....
                GenerateExcelExterno gee = new GenerateExcelExterno(jsonFileProject, jsonFileIssues, key, ruta, excelFile);
                gee.execute();
                .....
            }
        }
        .....
        .....
    }

GenerateExcel类:其中它是生成文件的重要方法

我知道我必须将SwingWorker添加到GenerateExcel类以解冻GUI,但我无法得到它

该方法创建文档,因此doInBackground工作,但面板中的进度条继续冻结

public class GenerateExcel extends SwingWorker<Integer, Void> {

    String jsonFileProject, jsonFileIssues, key, ruta, excelFile;

    public GenerateExcel(String jsonFileProject, String jsonFileIssues,
            String key, String ruta, String excelFile) {
        super();
        this.jsonFileProject = jsonFileProject;
        this.jsonFileIssues = jsonFileIssues;
        this.key = key;
        this.ruta = ruta;
        this.excelFile = excelFile;
    }

    public static void generateExcel(String jsonFileProject, String jsonFileIssues, String key, String ruta, String excelFile) {
        .....
        .....
        .....
    }

    @Override
    protected Integer doInBackground() throws Exception {
        // TODO Auto-generated method stub
        generateExcelExterno(jsonFileProject, jsonFileIssues, key, ruta, excelFile);
        return 100; //for example
    }
}

共 (1) 个答案

  1. # 1 楼答案

    我认为我们详细回答问题的能力受到提供的有限信息的限制,但问题的要点是,您需要在控制类ActionListener中设置SwingWorker,然后执行它。SwingWorker的doInBackground()方法的内部应该包含您的长时间运行的代码调用。不要在doInBackground内部进行任何Swing呼叫

    一些有用的链接: